TypeScriptのEither型を用いたError Handling
#WIP
https://blog.outer-inside.net/2020/03/typescript.html
https://zenn.dev/yoshiko/articles/7ff389c5fe8f06
https://blog.ojisan.io/my-new-error/
Eitherを使うことのデメ
ライブラリが必要
自作でもいいが、限界がある
left|rgithがあればいいという話ではない
JS/TSの言語思想はtry/catchなので扱いがめんどい
標準関数や、使用しているLibraryはバンバンthrowしてくる
結局、throwもEItherも両方気にしないといけなくなる
https://twitter.com/okunokentaro/status/1500395068041338880
わかる、Eitherでやってないけどそうなるのが容易に想像できるmrsekut.icon
try/catchをEitherに変換する関数が必要
イメージ
code:ts
function tryCatch<T, E>(
func: () => T,
onCatch: (e: unknown) => E
): Result<T, E> {
try {
const value = func();
return right(value);
} catch (err) {
return left(onCatch(err));
}
}
fp-tsにはtryCatch関数がある
使用
code:ts
const x = tryCatch(() => JSON.parse('{ "hoge": "piyo" }'));
const y = tryCatch(() => { throw 0 });
console.log(x); // => { _tag: 'Some', value: { hoge: 'piyo' } }
console.log(y); // => { _tag: 'None' }
成功すればその結果を、throwされればNoneを返す
https://qiita.com/frozenbonito/items/e708dfb3ab7c1fd3824d
良い感じ
でも、自作すると、伝播させる時にダルくなる
fp-tsとかで、monadを使うのはそのだるさを回避するためだから、トレードオフmrsekut.icon
https://labs.septeni.co.jp/entry/2020/07/23/100000
https://dev.classmethod.jp/articles/error-handling-practice-of-typescript/